﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Tools.TraceVisualiser.Interface;
using Noris.Tools.TraceVisualiser.Support;
using Djs.Tools.XmlPersistor;

namespace Noris.Tools.TraceVisualiser.BlockingVisualiser.Data
{
	/// <summary>
	/// Konfigurace SQL zobrazovače
	/// </summary>
	internal class SqlLockConfig : IInitialize
	{
		/// <summary>
		/// Zobrazovat procesy, které nic nevlastní (jen na něco čekají)
		/// </summary>
		public bool ShowProcessWithoutOwning { get; set; }
		/// <summary>
		/// Zobrazovat ExchangeEvent
		/// </summary>
		public bool ShowExchange { get; set; }
		/// <summary>
		/// Zobrazovat Pipe
		/// </summary>
		public bool ShowPipe { get; set; }
		/// <summary>
		/// Zobrazovat Port
		/// </summary>
		public bool ShowPort { get; set; }
		/// <summary>
		/// Soubor pro ukládání konfigurace.
		/// </summary>
		/// <remarks>
		/// Jde o field, ne o property, proto se její obsah nebude serializovat.
		/// </remarks>
		protected string ConfigFile;
		/// <summary>
		/// Uloží aktuální konfiguraci do souboru
		/// </summary>
		public void Save()
		{
			PersistArgs args = PersistArgs.Default;
			args.XmlFile = this.ConfigFile;
			XmlPersist.Serialize(this, args);
		}
		#region IInitialize Members
		/// <summary>
		/// Inicializace objektu v procesu Cache.Init
		/// </summary>
		void IInitialize.Initialize()
		{
			this.ConfigFile = System.IO.Path.Combine(Steward.UserAppDataPath, "Lcs.LockVisualiser.config");
			if (System.IO.File.Exists(this.ConfigFile))
			{
				PersistArgs args = PersistArgs.Default;
				args.XmlFile = this.ConfigFile;
				XmlPersist.LoadTo(args, this);
			}
		}
		#endregion
		#region Podpora pro zobrazování
		/// <summary>
		/// Vrací true, pokud daný Spid se má dle konfigurace zobrazovat
		/// </summary>
		/// <param name="spidInfo"></param>
		/// <returns></returns>
		internal bool IsSpidVisible(SqlSpidInfo spidInfo)
		{
			if (!this.ShowProcessWithoutOwning && !spidInfo.IsOwnerOfAnyResource)
				return false;
			return true;
		}
		/// <summary>
		/// Vrací true, pokud daný Resource se má dle konfigurace zobrazovat
		/// </summary>
		/// <param name="resource"></param>
		/// <returns></returns>
		internal bool IsResourceVisible(SqlResourceInfo resource)
		{
			string name = resource.Name;
			if (String.Equals(name, "exchangeEvent", StringComparison.OrdinalIgnoreCase))
				return this.ShowExchange;
			if (String.Equals(name, "pagelock", StringComparison.OrdinalIgnoreCase))
				return true;
			if (String.Equals(name, "keylock", StringComparison.OrdinalIgnoreCase))
				return true;
			if (String.Equals(name, "ridlock", StringComparison.OrdinalIgnoreCase))
				return true;
			return true;
		}
		#endregion
	}
}
